package xyj.sparrow.discovery.api;

import xyj.sparrow.common.discovery.SparrowServiceInstance;

import java.util.List;
import java.util.function.Consumer;

/**
 * 服务注册发现接口
 *
 * @author 江南小俊
 * @since 2021/6/20 下午1:28
 **/
public interface SparrowDiscovery {
    /**
     * 注册服务
     *
     * @param serviceName 服务名
     * @param address     ip地址
     * @param port        端口
     * @param payload     自定义数据
     * @author 江南小俊
     * @since 2021/6/20 下午1:28
     **/

    Object register(String serviceName, String address, int port, Object payload) throws Exception;

    /**
     * 取消注册/删除服务实例
     *
     * @param serviceIds 服务ids
     * @author 江南小俊
     * @since 2021/6/19 下午10:30
     **/
    void unregister(List<String> serviceIds);

    /**
     * 获取服务实例
     *
     * @param serviceName 服务名
     * @return xyj.sparrow.common.discovery.ServiceInstance
     * @author 江南小俊
     * @since 2021/6/20 下午1:33
     **/

    SparrowServiceInstance getInstance(String serviceName) throws Exception;

    /**
     * 添加服务实例监听
     *
     * @param serviceName      服务名
     * @param providerStrategy 提供者策略
     * @author 江南小俊
     * @since 2021/6/20 下午1:55
     **/

    void addListener(String serviceName, String providerStrategy, Consumer consumer) throws Exception;

    /**
     * 添加服务实例监听
     *
     * @param serviceName      服务名
     * @param providerStrategy 提供者策略
     * @author 江南小俊
     * @since 2021/6/20 下午1:55
     **/

    void addListener(String serviceName, String providerStrategy) throws Exception;

    /**
     * 添加服务实例监听 默认策略
     *
     * @param serviceName 服务名
     * @author 江南小俊
     * @since 2021/6/20 下午1:55
     **/

    void addListener(String serviceName) throws Exception;

    /**
     * 获取所有服务实例
     *
     * @param serviceName 服务名
     * @return java.util.List<xyj.sparrow.common.discovery.SparrowServiceInstance>
     * @author 江南小俊
     * @since 2021/6/25 上午7:37
     **/

    List<SparrowServiceInstance> listInstance(String serviceName) throws Exception;
}
